package com.molichuxing.services.infrastructure.service;

import java.util.List;
import java.util.Map;

import com.molichuxing.framework.dto.Paged;
import com.molichuxing.services.business.dto.request.create.VehicleCreateBizDto;
import com.molichuxing.services.infrastructure.dto.response.CarAssetDto;
import com.molichuxing.services.infrastructure.dto.response.CarDto;
import com.molichuxing.services.infrastructure.dto.response.CarModifyDto;
import com.molichuxing.services.property.CarsBusinessTypeEnum;
import com.molichuxing.services.property.CarsOperateStatusEnum;
import com.molichuxing.services.property.CarsStockTypeEnum;
import com.molichuxing.services.property.CarsTypeEnum;

/**
 * <p>
 * 车辆表 服务类
 * </p>
 *
 * @author
 * @since 2019-08-15
 */
public interface CarService {

	/**
	 * 根据车辆id查询车辆信息
	 * 
	 * @param id
	 * @return
	 */
	CarDto getCarById(Integer id);

	/**
	 * 根据车辆id集合查询车辆信息
	 * 
	 * @param ids
	 * @return
	 */
	Map<Integer, CarDto> getCarByIds(List<Integer> ids);

	/**
	 * 根据Vin查询车辆信息
	 * 
	 * @param vin
	 * @return
	 */
	CarDto getCarByVin(String vin);

	/**
	 * 根据车牌和vin查询车辆信息
	 * 
	 * @param vin
	 * @param licencePlate
	 * @return
	 */
	public CarDto getByVinLicencePlate(String vin, String licencePlate);

	/**
	 * 根据车牌和vin、运营状态查询车辆信息
	 * 
	 * @param vin
	 * @param licencePlate
	 * @param statusEnum
	 * @return
	 */
	public List<CarDto> getCarListBySearch(String vin, String licencePlate, CarsOperateStatusEnum statusEnum);

	/**
	 * 根据车牌和vin、运营状态查询车辆信息
	 * 
	 * @param vin
	 * @param licencePlate
	 * @param carsTypeEnum
	 * @return
	 */
	public List<CarDto> getCarListByCarType(String vin, String licencePlate, CarsTypeEnum carsTypeEnum);

	/**
	 * 根据车牌和vin、仓库id查询车辆信息
	 * 
	 * @param vin
	 * @param licencePlate
	 * @param stockId
	 * @return
	 */
	public List<CarDto> getCarListBySearch(String vin, String licencePlate, Integer stockId);

	/**
	 * 根据条件查询车辆列表
	 * 
	 * @param map
	 *            licencePlate(车牌) vin（车架号） vehicleId（车型）
	 *            purchaseStartDate（采购开始时间） purchaseEndDate（采购结束时间）
	 *            stockId（仓库id） vehicleType（车辆类型） status（运营状态） plateStatus（上牌状态）
	 * @param pageSize
	 * @param pageNum
	 * @return
	 */
	Paged<CarDto> getCarPage(Map<String, Object> map, Integer pageNum, Integer pageSize);

	/**
	 * 根据条件查询经销商车辆列表
	 * 
	 * @param map
	 *            licencePlate(车牌) vin（车架号） vehicleId（车型）
	 *            purchaseStartDate（采购开始时间） purchaseEndDate（采购结束时间）
	 *            stockId（仓库id） vehicleType（车辆类型） status（运营状态） plateStatus（上牌状态）
	 * @param pageSize
	 * @param pageNum
	 * @return
	 */
	Paged<CarDto> getCarDealerPage(Map<String, Object> map, Integer pageNum, Integer pageSize);

	/**
	 * 根据carId编辑车牌信息
	 * 
	 * @param carId
	 * @param licencePlate
	 * @param subcompanyId
	 * @return
	 */
	public int modifyLicencePlateById(Integer carId, String licencePlate, Integer subcompanyId);

	/**
	 * 根据carId编辑保险信息
	 * 
	 * @param carId
	 * @param compulsory
	 * @param commercial
	 * @return
	 */
	public int modifyInsuranceById(Integer carId, Integer compulsory, Integer commercial);

	/**
	 * 根据carId编辑库存ID
	 * 
	 * @param carId
	 * @param stockId
	 * @param stockType
	 * @return
	 */
	public int modifyStockIdById(Integer carId, Integer stockId, Integer stockType);

	/**
	 * 根据carId编辑车辆运营状态
	 * 
	 * @param carId
	 * @param carsOperateStatusEnum
	 * @return
	 */
	public int modifyStatusById(Integer carId, CarsOperateStatusEnum carsOperateStatusEnum);

	/**
	 * 查询有效的车辆的数量
	 * 
	 * @return
	 */
	public Integer getNoDeleteCarCount();

	/**
	 * 创建车辆信息
	 * 
	 * @param createBizDto
	 * @return
	 */
	public Integer createCar(VehicleCreateBizDto createBizDto);

	/**
	 * 根据仓库id，车型，车辆类型查询车辆信息
	 * 
	 * @param stockId
	 * @param vehicleId
	 * @param carType
	 * @return
	 */
	public List<CarDto> getSearchCarList(Integer stockId, Integer vehicleId, Integer carType, Integer carStatus);

	/**
	 * 交车修改车辆状态
	 * 
	 * @param carId
	 *            车辆id
	 * @return
	 */
	public Boolean modifyDeliveryCar(Integer carId);
	
	/**
	 * 根据库存列表
	 * 
	 * @param map
	 *            licencePlate(车牌) 
	 *            vin（车架号） 
	 *            vehicleId（车型）
	 *            vehicleType（车辆类型） 
	 *            status（运营状态）
	 * @return
	 */
	Paged<CarDto> getStockCarPage(Map<String, Object> map);



	/**
	 * 根据车辆业务类型查询车辆List
	 * 0: 无业务，1:专属里程，2:订阅服务，3大客户，4买断
	 * @return
	 */
	public List<CarDto> getCarsByBusinessType(CarsBusinessTypeEnum carsBusinessTypeEnum);

	/**
	 * 还车修改车辆信息
	 * 
	 * @param carId
	 *            车辆id
	 * @return
	 */
	public Boolean modifyReturnCar(Integer carId);

	/**
	 * 根据车辆业务类型查询车辆
	 * @param businessTypeList
	 * @return
	 */
	public List<CarDto> getCarsByBusinessTypeList(List<Integer> businessTypeList);

	/**
	 * 修改车辆类型与车辆状态
	 * @param carId
	 * @param  carStatus
	 * @param vehicleType
	 * @return
	 */
	public int 	modifyStatusAndVehicleTypeById(Integer carId, CarsOperateStatusEnum carStatus, CarsTypeEnum vehicleType);

	/**
	 * 根据库存id和类型获取车辆数量
	 * @param stockId
	 * @param carsStockTypeEnum
	 * @return
	 */
	public Map<Integer, Integer> getCarSumByStock(List<Integer> stockId, CarsStockTypeEnum carsStockTypeEnum);

	/**
	 * 车辆列表导出
	 *
	 * @param selectParams
	 * @return
	 */
	public List<CarDto> getCarListDownload(Map<String, Object> selectParams);

	public long getCarListDownloadCount(Map<String, Object> selectParams);

	public int modify(CarModifyDto dto);

	/**
	 * 根据车辆vin集合查询车辆信息
	 * @param vinList
	 * @return
	 */
	public List<CarDto> getByVinList(List<String> vinList);
	
	/**
	 * 修改车辆用途状态 以及 运营状态
	 * @param carId
	 * @param status 运营状态（0：待出租，1：已出租，2：不可租 3:已出售） 
	 * @param useType 用途状态（0：无用途，1：公务用车，2：派出所扣押，3：测试车 ，4：报废车，5：已丢失）
	 * @return
	 */
	public Boolean modifyUseType(Integer carId,Integer status,Integer useType);

	/**
	 * 买断车辆
	 * @return
	 */
	public List<CarAssetDto> getFullBuyOut();

	/**
	 * 运营车辆
	 * @return
	 */
	public List<CarAssetDto> getOperatingVehicle();

	/**
	 * 二次运营
	 * @return
	 */
	public List<CarAssetDto> getSecondaryOperations();

	/**
	 * 销售
	 * @return
	 */
	public List<CarAssetDto> getSell();

	/**
	 * 在库-实际在库
	 * @return
	 */
	public List<CarAssetDto> getInStockActuallyInStock();

	/**
	 * 在途车辆
	 * @return
	 */
	public List<CarAssetDto> getInRoadVehicle();

	/**
	 * 在库-诉讼中
	 * @return
	 */
	public List<CarAssetDto> getInStockInLawsuit();


}
